range: Split out a function
authorBenjamin Otte <otte@redhat.com>
Fri, 21 Nov 2014 07:24:51 +0000 (08:24 +0100)
committerBenjamin Otte <otte@redhat.com>
Tue, 25 Nov 2014 18:19:12 +0000 (19:19 +0100)
The position of a slider for a given value is something we care a
lot about and jump through hoops to get. See next commit for example.

gtk/gtkrange.c

index 77f86062aa6510e0821fa4191c8f75cfffbdd354..ae61727121a364f41eb63950514d31165d0517bf 100644 (file)
@@ -3530,6 +3530,120 @@ gtk_range_calc_request (GtkRange      *range,
     *has_steppers_cd = (n_steppers_cd > 0);
 }
 
+static void
+gtk_range_compute_slider_position (GtkRange     *range,
+                                   gdouble       adjustment_value,
+                                   GdkRectangle *slider_rect)
+{
+  GtkRangePrivate *priv = range->priv;
+  gint trough_border;
+  gboolean trough_under_steppers;
+
+  gtk_range_get_props (range, NULL, NULL, &trough_border, NULL,
+                       &trough_under_steppers, NULL, NULL);
+
+  if (priv->orientation == GTK_ORIENTATION_VERTICAL)
+    {
+      gint y, bottom, top, height;
+        
+      /* Slider fits into the trough, with stepper_spacing on either side,
+       * and the size/position based on the adjustment or fixed, depending.
+       */
+      slider_rect->x = priv->trough.x + trough_border;
+      slider_rect->width = priv->trough.width - trough_border * 2;
+
+      /* Compute slider position/length */
+      top = priv->trough.y;
+      bottom = priv->trough.y + priv->trough.height;
+
+      if (! trough_under_steppers)
+        {
+          top += trough_border;
+          bottom -= trough_border;
+        }
+
+      /* slider height is the fraction (page_size /
+       * total_adjustment_range) times the trough height in pixels
+       */
+
+      if (gtk_adjustment_get_upper (priv->adjustment) - gtk_adjustment_get_lower (priv->adjustment) != 0)
+        height = ((bottom - top) * (gtk_adjustment_get_page_size (priv->adjustment) /
+                                     (gtk_adjustment_get_upper (priv->adjustment) - gtk_adjustment_get_lower (priv->adjustment))));
+      else
+        height = priv->min_slider_size;
+
+      if (height < priv->min_slider_size ||
+          priv->slider_size_fixed)
+        height = priv->min_slider_size;
+
+      height = MIN (height, priv->trough.height);
+      
+      y = top;
+
+      if (gtk_adjustment_get_upper (priv->adjustment) - gtk_adjustment_get_lower (priv->adjustment) - gtk_adjustment_get_page_size (priv->adjustment) != 0)
+        y += (bottom - top - height) * ((adjustment_value - gtk_adjustment_get_lower (priv->adjustment)) /
+                                        (gtk_adjustment_get_upper (priv->adjustment) - gtk_adjustment_get_lower (priv->adjustment) - gtk_adjustment_get_page_size (priv->adjustment)));
+
+      y = CLAMP (y, top, bottom);
+      
+      if (should_invert (range))
+        y = bottom - (y - top + height);
+      
+      slider_rect->y = y;
+      slider_rect->height = height;
+    }
+  else
+    {
+      gint x, left, right, width;
+        
+      /* Slider fits into the trough, with stepper_spacing on either side,
+       * and the size/position based on the adjustment or fixed, depending.
+       */
+      priv->slider.y = priv->trough.y + trough_border;
+      priv->slider.height = priv->trough.height - trough_border * 2;
+
+      /* Compute slider position/length */
+      left = priv->trough.x;
+      right = priv->trough.x + priv->trough.width;
+
+      if (! trough_under_steppers)
+        {
+          left += trough_border;
+          right -= trough_border;
+        }
+
+      /* slider width is the fraction (page_size /
+       * total_adjustment_range) times the trough width in pixels
+       */
+
+      if (gtk_adjustment_get_upper (priv->adjustment) - gtk_adjustment_get_lower (priv->adjustment) != 0)
+        width = ((right - left) * (gtk_adjustment_get_page_size (priv->adjustment) /
+                                 (gtk_adjustment_get_upper (priv->adjustment) - gtk_adjustment_get_lower (priv->adjustment))));
+      else
+        width = priv->min_slider_size;
+
+      if (width < priv->min_slider_size ||
+          priv->slider_size_fixed)
+        width = priv->min_slider_size;
+
+      width = MIN (width, priv->trough.width);
+      
+      x = left;
+
+      if (gtk_adjustment_get_upper (priv->adjustment) - gtk_adjustment_get_lower (priv->adjustment) - gtk_adjustment_get_page_size (priv->adjustment) != 0)
+        x += (right - left - width) * ((adjustment_value - gtk_adjustment_get_lower (priv->adjustment)) /
+                                       (gtk_adjustment_get_upper (priv->adjustment) - gtk_adjustment_get_lower (priv->adjustment) - gtk_adjustment_get_page_size (priv->adjustment)));
+      
+      x = CLAMP (x, left, right);
+      
+      if (should_invert (range))
+        x = right - (x - left + width);
+      
+      priv->slider.x = x;
+      priv->slider.width = width;
+    }
+}
+
 static void
 gtk_range_calc_layout (GtkRange *range,
                       gdouble   adjustment_value)
@@ -3681,55 +3795,7 @@ gtk_range_calc_layout (GtkRange *range,
       priv->trough.width = range_rect.width;
       priv->trough.height = priv->stepper_c.y - priv->trough.y - stepper_spacing * has_steppers_cd;
 
-      /* Slider fits into the trough, with stepper_spacing on either side,
-       * and the size/position based on the adjustment or fixed, depending.
-       */
-      priv->slider.x = priv->trough.x + trough_border;
-      priv->slider.width = priv->trough.width - trough_border * 2;
-
-      /* Compute slider position/length */
-      {
-        gint y, bottom, top, height;
-        
-        top = priv->trough.y;
-        bottom = priv->trough.y + priv->trough.height;
-
-        if (! trough_under_steppers)
-          {
-            top += trough_border;
-            bottom -= trough_border;
-          }
-
-        /* slider height is the fraction (page_size /
-         * total_adjustment_range) times the trough height in pixels
-         */
-
-       if (gtk_adjustment_get_upper (priv->adjustment) - gtk_adjustment_get_lower (priv->adjustment) != 0)
-         height = ((bottom - top) * (gtk_adjustment_get_page_size (priv->adjustment) /
-                                      (gtk_adjustment_get_upper (priv->adjustment) - gtk_adjustment_get_lower (priv->adjustment))));
-       else
-          height = priv->min_slider_size;
-
-        if (height < priv->min_slider_size ||
-            priv->slider_size_fixed)
-          height = priv->min_slider_size;
-
-        height = MIN (height, priv->trough.height);
-        
-        y = top;
-
-       if (gtk_adjustment_get_upper (priv->adjustment) - gtk_adjustment_get_lower (priv->adjustment) - gtk_adjustment_get_page_size (priv->adjustment) != 0)
-         y += (bottom - top - height) * ((adjustment_value - gtk_adjustment_get_lower (priv->adjustment)) /
-                                         (gtk_adjustment_get_upper (priv->adjustment) - gtk_adjustment_get_lower (priv->adjustment) - gtk_adjustment_get_page_size (priv->adjustment)));
-
-        y = CLAMP (y, top, bottom);
-        
-        if (should_invert (range))
-          y = bottom - (y - top + height);
-        
-        priv->slider.y = y;
-        priv->slider.height = height;
-      }
+      gtk_range_compute_slider_position (range, adjustment_value, &priv->slider);
     }
   else
     {
@@ -3825,55 +3891,7 @@ gtk_range_calc_layout (GtkRange *range,
       priv->trough.width = priv->stepper_c.x - priv->trough.x - stepper_spacing * has_steppers_cd;
       priv->trough.height = range_rect.height;
 
-      /* Slider fits into the trough, with stepper_spacing on either side,
-       * and the size/position based on the adjustment or fixed, depending.
-       */
-      priv->slider.y = priv->trough.y + trough_border;
-      priv->slider.height = priv->trough.height - trough_border * 2;
-
-      /* Compute slider position/length */
-      {
-        gint x, left, right, width;
-        
-        left = priv->trough.x;
-        right = priv->trough.x + priv->trough.width;
-
-        if (! trough_under_steppers)
-          {
-            left += trough_border;
-            right -= trough_border;
-          }
-
-        /* slider width is the fraction (page_size /
-         * total_adjustment_range) times the trough width in pixels
-         */
-
-       if (gtk_adjustment_get_upper (priv->adjustment) - gtk_adjustment_get_lower (priv->adjustment) != 0)
-         width = ((right - left) * (gtk_adjustment_get_page_size (priv->adjustment) /
-                                   (gtk_adjustment_get_upper (priv->adjustment) - gtk_adjustment_get_lower (priv->adjustment))));
-       else
-         width = priv->min_slider_size;
-
-        if (width < priv->min_slider_size ||
-            priv->slider_size_fixed)
-          width = priv->min_slider_size;
-
-        width = MIN (width, priv->trough.width);
-        
-        x = left;
-
-       if (gtk_adjustment_get_upper (priv->adjustment) - gtk_adjustment_get_lower (priv->adjustment) - gtk_adjustment_get_page_size (priv->adjustment) != 0)
-          x += (right - left - width) * ((adjustment_value - gtk_adjustment_get_lower (priv->adjustment)) /
-                                         (gtk_adjustment_get_upper (priv->adjustment) - gtk_adjustment_get_lower (priv->adjustment) - gtk_adjustment_get_page_size (priv->adjustment)));
-        
-        x = CLAMP (x, left, right);
-        
-        if (should_invert (range))
-          x = right - (x - left + width);
-        
-        priv->slider.x = x;
-        priv->slider.width = width;
-      }
+      gtk_range_compute_slider_position (range, adjustment_value, &priv->slider);
     }
   
   gtk_range_update_mouse_location (range);